#include <stdio.h>
#include <stdlib.h>
typedef struct T_Node{
	int d;
	struct T_Node *next;
} Node, *List;

double getaverage(List f, int *nodenum);
void createlink(List *pf)
{
	int i;
	Node *p;

	*pf = (Node *)malloc(sizeof(Node));
	p = *pf;
	for(i = 1; i <= 99; i++)
	{
		p->d = i;
		p->next = (Node *)malloc(sizeof(Node));
		p = p->next;
	}
	p->d = 100;
	p->next  = NULL;
}

int main(int argc, char* argv[])
{
	int n;
	List f;
	double a;
	createlink(&f);
	a = getaverage(f, &n);
	printf("%d  %lf\n",n, a);
	return 0;
 }

//功能：题目所求函数 简化：不使用递归，简单遍历输出
double getaverage(List f, int *nodenum){
	int sum=0;//总数
	int num=0;//节点总数
	while(f!=NULL){
		sum+=f->d;
		num++;
		f=f->next;
	}
	*nodenum = num;
	return 1.0*sum/num;

}


/*
设计一个函数
	double getaverage(List f, int *nodenum) 
已知f为一个不带头结点单向链表的头指针，链表结点数据结构如下所示，使用递归函数，求出所有结点中数值的平均数。	
nodenum为结点数的输出参数，	返回平均数，如果为空链表，则返回0。
List的结构如下：
typedef struct T_Node{
	int d;
	struct T_Node *next;
} Node, *List;
createlink函数如下：
void createlink(List *pf)
{
	int i;
	Node *p;

	*pf = (Node *)malloc(sizeof(Node));
	p = *pf;
	for(i = 1; i <= 99; i++)
	{
		p->d = i;
		p->next = (Node *)malloc(sizeof(Node));
		p = p->next;
	}
	p->d = 100;
	p->next  = NULL;
}

如下的main函数执行后
int main(int argc, char* argv[])
{
	int n;
	List f;
	double a;
	createlink(&f);
	a = getaverage(f, &n);
	printf("%d  %lf\n",n, a);
	return 0;
 }
执行的结果为
100  50.500000
*/